package cn.demoncat.util.mybatis.util;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.Ordered;

/**
 * 数据源切换器
 * 
 * @author 延晓磊
 *
 * @since 2017年10月13日
 */
@Aspect
public class DataSourceAspect implements Ordered {

    /**
	 * 功能描述：声明切点 = @ReadDataSource的方法
	 *
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年7月21日
	 */
	@Pointcut("@annotation(cn.demoncat.util.mybatis.annotation.ReadDataSource)")
	public void readDataSource() { 
		// 切点
	}
	
	/**
	 * 环绕通知：进入读方法前设置为读库，出读方法后设置为写库
	 * 
	 * @param point
	 * @return
	 * 
	 * @author 延晓磊
	 * @throws Throwable 
	 *
	 * @since 2017年10月13日
	 */
	@Around("readDataSource()")
	public Object around(ProceedingJoinPoint point) throws Throwable {
        try {
        	//设置使用读库
        	DataSourceHolder.setRead();
        	//执行切点操作
        	return point.proceed();
        } finally {
        	//完成时清空数据源类型
        	DataSourceHolder.clean();
        }
    }

	/**
	 * 优先执行
	 * 
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年10月13日
	 *
	 */
    @Override
    public int getOrder() {
        return 0;
    }
}
